package scripts

import (
	"MessageSendService/app/common/models/accounts"
	"fmt"
	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
	sms "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms/v20210111" // 引入sms
)

//参考https://cloud.tencent.com/document/product/382/43199  腾讯云SDK发送短信的接口

var smsClient *SmsClient

type SmsClient struct {
	*sms.Client
}

// GetSmsClient 获取短信客户端  todo 需要处理并发控制
func GetSmsClient(secretId, secretKey string) SmsClient {
	if smsClient == nil {
		smsClient = &SmsClient{
			newSmsClient(secretId, secretKey),
		}
		return *smsClient
	}
	return *smsClient
}

func newSmsClient(secretId, secretKey string) *sms.Client {
	// 必要步骤：
	// 实例化一个认证对象，入参需要传入腾讯云账户密钥对 SecretId，SecretKey。
	// 硬编码密钥到代码中有可能随代码泄露而暴露，有安全隐患，并不推荐。
	// 为了保护密钥安全，建议将密钥设置在环境变量中或者配置文件中。
	// SecretId、SecretKey 查询: https://console.cloud.tencent.com/cam/capi
	// credential := common.NewCredential("SecretId", "SecretKey")
	credential := common.NewCredential(
		secretId,
		secretKey,
	)
	/* 非必要步骤:
	 * 实例化一个客户端配置对象，可以指定超时时间等配置 */
	cpf := profile.NewClientProfile()

	/* SDK默认使用POST方法。
	 * 如果您一定要使用GET方法，可以在这里设置。GET方法无法处理一些较大的请求 */
	cpf.HttpProfile.ReqMethod = "POST"
	cpf.HttpProfile.ReqTimeout = 10 // 请求超时时间，单位为秒(默认60秒)
	/* 指定接入地域域名，默认就近地域接入域名为 sms.tencentcloudapi.com ，也支持指定地域域名访问，例如广州地域的域名为 sms.ap-guangzhou.tencentcloudapi.com */
	cpf.HttpProfile.Endpoint = "sms.tencentcloudapi.com"

	/* SDK默认用TC3-HMAC-SHA256进行签名，非必要请不要修改这个字段 */
	cpf.SignMethod = "HmacSHA1"

	/* 实例化要请求产品(以sms为例)的client对象
	 * 第二个参数是地域信息，可以直接填写字符串ap-guangzhou，支持的地域列表参考 https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8 */
	client, _ := sms.NewClient(credential, "ap-guangzhou", cpf)
	return client
}

// 发送短信
func (s *SmsClient) SendSmsMessage(phoneNumbers []string, acc accounts.TencentSmsAccount, templateParam []string) (*sms.SendSmsResponse, error) {

	request := sms.NewSendSmsRequest()

	request.PhoneNumberSet = common.StringPtrs(phoneNumbers)
	request.SmsSdkAppId = common.StringPtr(acc.SmsSdkAppId)
	request.SignName = common.StringPtr(acc.SignName)
	request.TemplateId = common.StringPtr(acc.TemplateId)
	request.TemplateParamSet = common.StringPtrs(templateParam)

	response, err := s.SendSms(request)
	if _, ok := err.(*errors.TencentCloudSDKError); ok {
		fmt.Printf("An API error has returned: %s", err)
		return nil, fmt.Errorf("腾讯云短信发送失败", err)
	}
	if err != nil {
		return nil, err
	}
	//腾讯云返回结果 根据业务进行处理
	fmt.Printf("%s", response.ToJsonString())

	return response, nil
}
